package cn.limbo.myandserver.component;

import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import cn.limbo.myandserver.utils.JsonUtils;
import com.yanzhenjie.andserver.annotation.Converter;
import com.yanzhenjie.andserver.framework.MessageConverter;
import com.yanzhenjie.andserver.framework.body.JsonBody;
import com.yanzhenjie.andserver.http.ResponseBody;
import com.yanzhenjie.andserver.util.IOUtils;
import com.yanzhenjie.andserver.util.MediaType;

import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Type;
import java.nio.charset.Charset;

/**
 * 消息转换器
 */
@Converter
public class AppMessageConverter implements MessageConverter {

    /**
     * 把添加了RestController注解的类中的方法返回值转化为JSON数据格式。
     * @param output JSON数据里的data内容
     * @param mediaType 文件类型
     * @return 转换后的JSON数据格式
     */
    @Override
    public ResponseBody convert(@NonNull Object output, @Nullable MediaType mediaType) {
        return new JsonBody(JsonUtils.successJson(output));
    }

    /**
     * 把客户端的请求参数转换为添加了RequestBody注解或者FormPart注解的服务端参数对应的Model对象。
     * @param stream 输入流
     * @param mediaType 文件类型
     * @param type 对象类型
     * @param <T> 对象类型
     * @return 对应的Model对象
     * @throws IOException 异常
     */
    @Nullable
    @Override
    public <T> T convert(@NonNull InputStream stream, @Nullable MediaType mediaType, Type type) throws IOException {
        Charset charset = mediaType == null ? null : mediaType.getCharset();
        if (charset == null) {
            return JsonUtils.parseJson(IOUtils.toString(stream), type);
        }
        return JsonUtils.parseJson(IOUtils.toString(stream, charset), type);
    }
}
